#ifndef TMP_HPP
#define TMP_HPP

template <int n>
struct Fibonacci {
	static const int value = Fibonacci<n-1>::value + Fibonacci<n-2>::value;
};

template<>
struct Fibonacci<0> {
	static const int value = 0;
};

template<>
struct Fibonacci<1> {
	static const int value = 1;
};

template <int n>
struct Fibonacci2 {
	enum number {value = Fibonacci2<n-1>::value + Fibonacci2<n-2>::value};
};
template <>
struct Fibonacci2<1> {
	enum number {value = 1};
};
template <>
struct Fibonacci2<0> {
	enum number {value = 0};
};

template <int n>
struct Factorial {
	enum { value = Factorial<n-1>::value * n };
};
template <>
struct Factorial<1> {
	enum { value = 1 };
};

template<int n>
class Power2 {
public:
	enum {value = 2*Power2<n-1>::value};
};
template<>
class Power2<0>{
public:
	enum {value = 1};
};

template<int base, int power>
struct Power {
	enum {value = base*Power<base,power-1>::value };
};
template<int base>

struct Power<base,0> {
	enum {value = 1 };
};

#endif